/**
 * Datentraeger Subklasse von Medium, Superklasse von der Klasse
 * Hoerbuch. Sie stellt die Variablen fuer alle Daten des Datentraegers
 * zuverfuegung.
 * 
 * Alle Methoden mit setze...() weisen einer Variablen einen Wert zu.
 * Alle gib...() Methoden liefern den Wert der jeweiligen Variablen
 * zurueck. Alle ...Hinzufuegen Methoden fuegen einen Wert einer Liste 
 * hinzu.
 * 
 * Datei: Datentraeger.java        Autor: Simon Schindelmann 
 * Datum: 05.11.11                 Version: 0.2
 * 
 * Historie: 
 * 05.11.11:  v0.1    Klasse wurde angelegt.
 * 15.12.11   v0.2    gibBeteiligteString () Methode angelegt um die
 *                    Namen der beteiligten Persoen als String zurueck 
 *                    zugeben.
 * 
 */

package medienverwaltung;

import java.util.*;
import personenverwaltung.Person;


public class Datentraeger extends Medium 
{
  private static final long serialVersionUID = 4159347790564555600L;
  private String version, serie, teil;
  private int spielzeit;
  // Gibt an ob es sich um Daten, Video oder Audio Datentraeger handelt.
  private Datentraegertyp datentraegertyp;
  private long speicherplatz;
  private ArrayList<Person> beteiligtListe = new ArrayList<Person> ();


  public Datentraeger (String titel, String datum, Abmessung abmessung,
      Datentraegertyp typ) throws KeinDatumFormat
  {
    super (titel, datum, abmessung);
    datentraegertyp = typ;
    initial = "DT";
  }


  public Datentraeger (String titel, String datum, Abmessung abmessung,
      String verlag, String ausgabe, Datentraegertyp typ, 
      String version) throws KeinDatumFormat
  {
    super (titel, datum, abmessung, verlag, ausgabe);
    datentraegertyp = typ;
    this.version = version;
    initial = "DT";
  }

  
  /**
   * Hier wird die Spielzeit des Datentraegers gespeichert.
   * @param zeit Spielzeit des Datentraegers.
   */
  public void setzeSpielzeit (int zeit)
  {
    spielzeit = zeit;
  }

  
  /**
   * Hier wird der Speicherplatz des Datentreagers gespeichert.
   * @param Speicherplatz des Datentraegers.
   */
  public void setzeSpeicherplatz (long platz)
  {
    speicherplatz = platz;
  }

  /**
   * Hier wird die Serie des Datentraegers.
   * @param serie Serie des Datentraegers.
   */
  public void setzeSerie (String serie)
  {
    this.serie = serie;
  }

  
  /**
   * Hier wird die Version des Datentraegers gespeichert.
   * @param version Version des Datentraegers.
   */
  public void setzeVersion (String version)
  {
    this.version = version;
  }

  
  /**
   * Fuegt die an dem Datentrager beteiligten Personen hinzu.
   * @param personen Die Personen die am Datentraegerbeteiligt sind.
   * @throws NameEnthaeltZahlenSonderzeichen
   */
  public void beteiligteHinzufuegen (String personen)
      throws NameEnthaeltZahlenSonderzeichen
  {
    beteiligtListe.clear ();
    beteiligteSetzen (personen);
  }

  
  /**
   * Hier wird der Teil gesetzt, falls der Datentraeger mehrere Teile 
   * hat.
   * @param teil Teil des Datentragers.
   */
  public void setzeTeil (String teil)
  {
    this.teil = teil;
  }

  
  /**
   * Hier werden die beteiligen des Datentragers zurueck gegeben.
   * @return ArrayListe mit den beteiligten Persoen des Datentraeers
   */
  public ArrayList<Person> gibBeteiligte ()
  {
    return beteiligtListe;
  }
  
  
  /**
   * Hier werden die beteiligten Personen als String zurueck gegeben.
   * @return String mit den beteiligten Personen des Datentraegers.
   */
  public String gibBeteiligteString ()
  {
    String beteiligte = "";
    Person b;
    
    for (int i = 0; i < beteiligtListe.size (); i++)
    {
      b = beteiligtListe.get (i);
      if (i < (beteiligtListe.size () - 1))
      {
        beteiligte = beteiligte + "" + b.gibVornamen () + " "
            + b.gibNachname () + ", ";
      }
      else
      {
        beteiligte = beteiligte + "" + b.gibVornamen () + " "
            + b.gibNachname ();
      }
    }
    return beteiligte;
  }


  /**
   * Gibt die Version des Datentraegers zurueck.
   * @return Version des Datentraegers.
   */
  public String gibVersion ()
  {
    return version;
  }

  
  /**
   * Gibt die Spielzeit des Datentraerges zurueck.
   * @return Spielzeit des Datentraegers.
   */
  public int gibSpielzeit ()
  {
    return spielzeit;
  }

  
  /**
   * Gibt den Typ des Datentraegers zurueck.
   * @return Typ des Datentregers.
   */
  public Datentraegertyp gibDatentraegertyp ()
  {
    return datentraegertyp;
  }

  
  /**
   * Gibt den Speicherplatz des Datentraeger zurueck.
   * @return Speicherplatz des Datentraegers.
   */
  public long gibSpeicherplatz ()
  {
    return speicherplatz;
  }

  
  /**
   * Gibt die Serie des Datentraegers zurueck.
   * @return Serie des Datentraegers.
   */
  public String gibSerie ()
  {
    return serie;
  }

  
  /**
   * Gibt den Teil des Datentraegers zurueck, falls der Datentrager 
   * mehrere Teile hat.
   * @return Teil des Datentraegers.
   */
  public String gibTeil ()
  {
    return teil;
  }

  
  /**
   * Der String mit den Beteiligten wird hier uebergeben. Der String 
   * wird von einer Namenparser-Methode zerteilt und eine ArrayList wird
   * zurueck geliefert. Die Enthaelt pro Namen ein Array. Das Array
   * enthaelt jeden Teilnamen des kompletten Namens. Dann werden die
   * namen in den Arrays bis zur vorletzten Stelle im String vorname
   * gespeichert und der letzte Arraywert ist der Nachname der wird im
   * String nachname gespeichert. Aus den beiden Strings kann dann ein
   * Objekt Person erzeugt werden und der beteiligtListe hinzugefuegt
   * werden.
   * 
   * @param beteiligte Hier wird ein String mit Namen der beteiligten 
   * Personen uebergeben.
   * @NameEnthealtZahlen
   */
  private void beteiligteSetzen (String beteiligte)
      throws NameEnthaeltZahlenSonderzeichen
  {
    ArrayList<String[]> temp = new ArrayList<String[]> ();
    // ArrayList enthaelt die Namen der Beteiligten
    temp = NamenParser.parsen (beteiligte);
    // Speichert den Array mit dem Beteiligten Namen
    String[] buffer;
    Person p;

    for (int i = 0; i < temp.size (); i++)
    {
      buffer = temp.get (i);
      String vorname = "";
      String nachname = "";

      for (int j = 0; j < buffer.length; j++)
      {
        /*
         * Prueft ob es der vorletzte Arraywert ist falls ja wird 
         * dannach in den else Teil gegangen und der Nachname wird 
         * gespeichert.
         */
        if (j < (buffer.length - 1))
        {
          vorname = "" + buffer[j];
        }
        else
        {
          nachname = "" + buffer[j];
        }
      }
      p = new Person (vorname, nachname);
      beteiligtListe.add (p);
    }
  }
  
  
  /**
   * Hier wird der Typ des Datentraegers gesetzt.
   * @param typ Typ des Datentraegers.
   */
  public void setzeTyp (String typ)
  {
    if(typ.equals ("DATEN"))
    {
      datentraegertyp = Datentraegertyp.DATEN;
    }
    else if (typ.equals ("VIDEO"))
    {
      datentraegertyp = Datentraegertyp.VIDEO;
    }
    else
    {
      datentraegertyp = Datentraegertyp.AUDIO;
    }
  }
}
